/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Cliente;

import Conexion.Pais;
import Conexion.SerializedObject;
import Servidor.ServidorThread;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 * Clase de prueba que permite simular una partida con unos paises predeterminados
 * unas conexiones de cliente y conjunto de paises.
 */
public class Partida extends Thread {
    private int jug=0;
    private String color;
    private ArrayList<Pais> mundo=new ArrayList<Pais>();
    private ArrayList<ServidorThread> jugadores=new ArrayList<ServidorThread>();
    //private String[] alfabeto=new String[]{"A","B","C","D","E","F","G","H","I",
    //"J","K","L","M","N","Ñ","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
    private String[] alfabeto=new String[]{"1","2","3","4","5","6","7","8",
    "9" ,"10","11","12","13","14","15","16","17","18","19","20","21","22",
    "23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42"};


    /**
     *
     */
    public void jugar(){
        System.out.println("Jugada1 Jugada2 Jugada3 Jugada4\n");
        for(int i=0;i<alfabeto.length;i++){
            Pais p=new Pais();
            p.setNombre(alfabeto[i]);
            mundo.add(p);
        }
        //vecinos pais 1
        ArrayList<Pais> vec=new ArrayList<Pais>();
        vec.add(mundo.get(1));
        vec.add(mundo.get(3));
        vec.add(mundo.get(38));
        mundo.get(0).setVecinos(vec);

        //vecinos pais 2
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(0));
        vec.add(mundo.get(2));
        vec.add(mundo.get(3));
        vec.add(mundo.get(4));
        mundo.get(1).setVecinos(vec);

        //vecinos pais 3
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(4));
        vec.add(mundo.get(5));
        vec.add(mundo.get(13));
        mundo.get(2).setVecinos(vec);

        //vecinos pais 4
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(0));
        vec.add(mundo.get(1));
        vec.add(mundo.get(4));
        vec.add(mundo.get(6));
        mundo.get(3).setVecinos(vec);

        //vecinos pais 5
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(1));
        vec.add(mundo.get(2));
        vec.add(mundo.get(3));
        vec.add(mundo.get(5));
        vec.add(mundo.get(7));
        vec.add(mundo.get(8));
        mundo.get(4).setVecinos(vec);

        //vecinos pais 6
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(2));
        vec.add(mundo.get(4));
        vec.add(mundo.get(7));
        mundo.get(5).setVecinos(vec);

        //vecinos pais 7
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(3));
        vec.add(mundo.get(4));
        vec.add(mundo.get(7));
        vec.add(mundo.get(8));
        mundo.get(6).setVecinos(vec);

        //vecinos pais 8
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(4));
        vec.add(mundo.get(5));
        vec.add(mundo.get(6));
        vec.add(mundo.get(8));
        mundo.get(7).setVecinos(vec);

        //vecinos pais 9
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(6));
        vec.add(mundo.get(7));
        vec.add(mundo.get(9));
        mundo.get(8).setVecinos(vec);

        //vecinos pais 10
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(8));
        vec.add(mundo.get(10));
        vec.add(mundo.get(11));
        mundo.get(9).setVecinos(vec);

         //vecinos pais 11
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(9));
        vec.add(mundo.get(11));
        vec.add(mundo.get(12));
        vec.add(mundo.get(19));
        mundo.get(10).setVecinos(vec);

        //vecinos pais 12
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(9));
        vec.add(mundo.get(10));
        vec.add(mundo.get(12));
        mundo.get(11).setVecinos(vec);

        //vecinos pais 13
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(11));
        vec.add(mundo.get(10));
        mundo.get(12).setVecinos(vec);

        //vecinos pais 14
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(14));
        vec.add(mundo.get(15));
        vec.add(mundo.get(3));
        mundo.get(13).setVecinos(vec);

        //vecinos pais 15
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(13));
        vec.add(mundo.get(16));
        vec.add(mundo.get(25));
        mundo.get(14).setVecinos(vec);

        //vecinos pais 16
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(13));
        vec.add(mundo.get(14));
        vec.add(mundo.get(16));
        vec.add(mundo.get(17));
        mundo.get(15).setVecinos(vec);

        //vecinos pais 17
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(14));
        vec.add(mundo.get(15));
        vec.add(mundo.get(17));
        vec.add(mundo.get(18));
        vec.add(mundo.get(25));
        mundo.get(16).setVecinos(vec);

        //vecinos pais 18
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(15));
        vec.add(mundo.get(16));
        vec.add(mundo.get(18));
        vec.add(mundo.get(19));
        mundo.get(17).setVecinos(vec);

        //vecinos pais 19
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(16));
        vec.add(mundo.get(17));
        vec.add(mundo.get(25));
        vec.add(mundo.get(19));
        vec.add(mundo.get(20));
        vec.add(mundo.get(26));
        mundo.get(18).setVecinos(vec);

        //vecinos pais 20
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(18));
        vec.add(mundo.get(17));
        vec.add(mundo.get(20));
        vec.add(mundo.get(21));
        vec.add(mundo.get(22));
        vec.add(mundo.get(10));
        mundo.get(19).setVecinos(vec);

        //vecinos pais 21
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(19));
        vec.add(mundo.get(22));
        vec.add(mundo.get(26));
        vec.add(mundo.get(18));
        mundo.get(20).setVecinos(vec);

        //vecinos pais 22
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(19));
        vec.add(mundo.get(22));
        vec.add(mundo.get(23));
        mundo.get(21).setVecinos(vec);

        //vecinos pais 23
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(19));
        vec.add(mundo.get(20));
        vec.add(mundo.get(21));
        vec.add(mundo.get(23));
        vec.add(mundo.get(24));
        mundo.get(22).setVecinos(vec);

        //vecinos pais 24
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(21));
        vec.add(mundo.get(22));
        vec.add(mundo.get(24));
        mundo.get(23).setVecinos(vec);

        //vecinos pais 25
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(22));
        vec.add(mundo.get(23));
        mundo.get(24).setVecinos(vec);

        //vecinos pais 26
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(14));
        vec.add(mundo.get(16));
        vec.add(mundo.get(18));
        vec.add(mundo.get(26));
        vec.add(mundo.get(27));
        vec.add(mundo.get(28));
        mundo.get(25).setVecinos(vec);

        //vecinos pais 27
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(18));
        vec.add(mundo.get(25));
        vec.add(mundo.get(20));
        vec.add(mundo.get(28));
        vec.add(mundo.get(29));
        mundo.get(26).setVecinos(vec);

        //vecinos pais 28
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(25));
        vec.add(mundo.get(28));
        vec.add(mundo.get(30));
        vec.add(mundo.get(31));
        mundo.get(27).setVecinos(vec);

        //vecinos pais 29
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(25));
        vec.add(mundo.get(26));
        vec.add(mundo.get(27));
        vec.add(mundo.get(29));
        vec.add(mundo.get(31));
        mundo.get(28).setVecinos(vec);

        //vecinos pais 30
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(26));
        vec.add(mundo.get(28));
        vec.add(mundo.get(31));
        vec.add(mundo.get(32));
        mundo.get(29).setVecinos(vec);

         //vecinos pais 31
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(27));
        vec.add(mundo.get(39));
        vec.add(mundo.get(40));
        vec.add(mundo.get(41));
        mundo.get(30).setVecinos(vec);

        //vecinos pais 32
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(27));
        vec.add(mundo.get(28));
        vec.add(mundo.get(29));
        vec.add(mundo.get(30));
        vec.add(mundo.get(32));
        vec.add(mundo.get(41));
        mundo.get(31).setVecinos(vec);

        //vecinos pais 33
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(29));
        vec.add(mundo.get(31));
        vec.add(mundo.get(33));
        mundo.get(32).setVecinos(vec);

        //vecinos pais 34
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(32));
        vec.add(mundo.get(34));
        vec.add(mundo.get(36));
        mundo.get(33).setVecinos(vec);

        //vecinos pais 35
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(33));
        vec.add(mundo.get(35));
        mundo.get(34).setVecinos(vec);

        //vecinos pais 36
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(34));
        vec.add(mundo.get(36));
        mundo.get(35).setVecinos(vec);

        //vecinos pais 37
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(33));
        vec.add(mundo.get(35));
        mundo.get(36).setVecinos(vec);

        //vecinos pais 38
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(38));
        vec.add(mundo.get(41));
        mundo.get(37).setVecinos(vec);

        //vecinos pais 39
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(0));
        vec.add(mundo.get(39));
        vec.add(mundo.get(40));
        vec.add(mundo.get(41));
        vec.add(mundo.get(37));
        mundo.get(38).setVecinos(vec);

        //vecinos pais 40
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(30));
        vec.add(mundo.get(38));
        vec.add(mundo.get(40));
        mundo.get(39).setVecinos(vec);

        //vecinos pais 41
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(30));
        vec.add(mundo.get(39));
        vec.add(mundo.get(41));
        vec.add(mundo.get(38));
        mundo.get(40).setVecinos(vec);

        //vecinos pais 42
        vec=new ArrayList<Pais>();
        vec.add(mundo.get(30));
        vec.add(mundo.get(31));
        vec.add(mundo.get(40));
        vec.add(mundo.get(37));
        vec.add(mundo.get(38));
        mundo.get(39).setVecinos(vec);

        this.start();
    }
    /**
     *
     * @param Thread
     */
    public void addJug(ServidorThread Thread){
        this.jugadores.add(Thread);


    }
    public void actualizarJugs(){
        System.out.println("ACTUALIZANDO");
        SerializedObject o=new SerializedObject();
        o.setTipoM("IDENTIFICAR");
        ArrayList<String> oponents=new ArrayList<String>();
        for(int i=0;i<this.jugadores.size();i++){
            oponents.add(this.jugadores.get(i).getNombre());
        }

        for(int i=0;i<this.jugadores.size();i++){
            o.setName(this.jugadores.get(i).getNombre());
            o.setMensaje(this.jugadores.get(i).getNumThread()+1+"");
            String temp=oponents.remove(i);
            o.setObject(oponents);
            jugadores.get(i).enviar(o);
            oponents.add(i, temp);
        }
    }

    /**
     *
     * @param n
     */
    public void remJug(int n){
        this.jugadores.remove(n);
    }
    /**
     *
     */
    public void addJug(){
        jug++;
    }
    /**
     *
     * @return
     */
    public int getJug(){
        return this.jugadores.size();
    }

    public String calcularUniXPaises(String name){
        int total=0;
        for(int i=0;i<mundo.size();i++){
            if(mundo.get(i).getJugador().equalsIgnoreCase(name)){
                total++;
            }
        }
        int unidades=total/3;
        if(unidades<3){
            return 3+"";
        }
        return unidades+"";
    }

    @Override
    public void run(){
        boolean acabo=false;
        int turno=0;
        int cont=0;

        while(!acabo){
            SerializedObject o1=new SerializedObject();
            o1.setTipoM("ESPERAR");
            o1.setTurno(turno+"");
            SerializedObject o2=new SerializedObject();
            o2.setTipoM("JUGAR");
            o1.setObject(mundo);
            o2.setObject(mundo);
            SerializedObject o3=new SerializedObject();
            o2.setTurno(turno+"");
            o2.setName(jugadores.get(turno).getNombre());
            System.out.println(jugadores.get(turno).getNombre());

            ArrayList<Pais> mundo1=(ArrayList<Pais>) o2.getObject();
            for(int i=0;i<mundo1.size();i++){
                System.out.println(mundo1.get(i).getNombre()+" "+
                mundo1.get(i).getJugador()+" "+mundo1.get(i).getUnidades());
            }

            for(int i=0;i<this.jugadores.size();i++){
                if(i==turno)
                 jugadores.get(turno).enviar(o2);
                else
                 jugadores.get(i).enviar(o1);
            }

            o3=jugadores.get(turno).recibir();
            mundo=(ArrayList<Pais>) o3.getObject();
            for(int i=0;i<mundo.size();i++){
                System.out.println(mundo.get(i).getNombre()+" "+
                mundo.get(i).getJugador()+" "+mundo.get(i).getUnidades());
            }
            //o1.setObject(o3.getObject());
            //o2.setObject(o3.getObject());

            turno++;
            cont++;
            if(turno==4){
                turno=0;
                //cont++;
                System.out.println("llega aca");
                System.out.println(cont);
            }
            if(cont==42){
                acabo=true;
                for(int i=0;i<this.jugadores.size();i++){
                    SerializedObject o4=new SerializedObject();
                   
                    o4.setTurno(turno+"");
                    o4.setTipoM("TERMINAR");
                    o4.setObject(mundo);
                    jugadores.get(i).enviar(o4);
                }
            }
        }
        this.ubicarDurantePartida();
    }
    //Norteamerica=5
    //Suramerica=2
    //Europa=5
    //Africa=3
    //Asia=7
    //Australia=2

    public void ubicarDurantePartida(){
        boolean acabo=false;
        int turno=0;
        int cont=0;
        System.out.println("ubicarDurantePartida");
        while(!acabo){
            SerializedObject o1=new SerializedObject();
            o1.setTipoM("ESPERAR");
            SerializedObject o2=new SerializedObject();
            o2.setTipoM("JUGAR");
            o1.setObject(mundo);
            o2.setObject(mundo);
            o2.setMensaje(this.calcularUniXPaises(jugadores.get(turno).getNombre()));
            SerializedObject o3=new SerializedObject();

            o2.setName(jugadores.get(turno).getNombre());
            System.out.println(jugadores.get(turno).getNombre());

            ArrayList<Pais> mundo1=(ArrayList<Pais>) o2.getObject();
            for(int i=0;i<mundo1.size();i++){
                System.out.println(mundo1.get(i).getNombre()+" "+
                mundo1.get(i).getJugador()+" "+mundo1.get(i).getUnidades());
            }

            for(int i=0;i<this.jugadores.size();i++){
                if(i==turno)
                 jugadores.get(turno).enviar(o2);
                else
                 jugadores.get(i).enviar(o1);
            }

            o3=jugadores.get(turno).recibir();
            mundo=(ArrayList<Pais>) o3.getObject();
            for(int i=0;i<mundo.size();i++){
                System.out.println(mundo.get(i).getNombre()+" "+
                mundo.get(i).getJugador()+" "+mundo.get(i).getUnidades());
            }
            this.Atacar(turno);
            turno++;
            if(turno==4){
                turno=0;
                cont++;
                System.out.println(cont);
            }
            if(cont==2){
                acabo=true;
                for(int i=0;i<this.jugadores.size();i++){
                    SerializedObject o4=new SerializedObject();
                    o4.setTipoM("TERMINAR");
                    o4.setObject(mundo);
                    jugadores.get(i).enviar(o4);
                }
            }
        }
    }
    public void Atacar(int turno){
        System.out.println("ATACAR");
        SerializedObject so2=new SerializedObject();
        so2.setTipoM("ATACAR");
        so2.setObject(mundo);

        jugadores.get(turno).enviar(so2);
        boolean todos=false;
        //ATACAR
        //-------------------------
        //-------------------------
        //-------------------------
        SerializedObject o2=null;
        while(!todos){
            so2.setObject(mundo);
            jugadores.get(turno).enviar(so2);
            System.out.println("Esperando Mensaje del Cliente");
            o2=jugadores.get(turno).recibir();
            System.out.println(o2.getTipoM());
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
                Logger.getLogger(Partida.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(o2.getTipoM().equalsIgnoreCase("CONTINUAR")){
                String[] TOKEN =o2.getMensaje().split(" ");
                System.out.println(mundo.get(Integer.parseInt(TOKEN[0])).getUnidades());
                System.out.println(mundo.get(Integer.parseInt(TOKEN[1])).getUnidades());
                /*int[] temp=this.simDados(mundo.get(Integer.parseInt(TOKEN[0])).getUnidades(),
                        mundo.get(Integer.parseInt(TOKEN[1])).getUnidades());
                if(temp[3]==-1){

                }
                else if(temp[6]==-1){

                }*/
            }
            if(o2.getTipoM().equalsIgnoreCase("PARAR ATAQUE")){
                System.out.println("PARAR ATAQUE");
                todos=true;
            }
        }
    }

}
            